"""
模拟的InfluxDB数据接口模块
用于替代真实的数据库连接，提供模拟的实时和历史数据
"""

import numpy as np
import time
import logging
from datetime import datetime, timedelta
import random

# 全局变量存储模拟数据
_simulation_data_buffer = []
_current_time = time.time()

def _generate_simulation_data():
    """
    生成模拟的传感器数据
    返回包含25个测点的数据数组
    """
    global _current_time
    
    # 基础负荷值（MW）
    base_load = 400 + random.uniform(-20, 20)
    
    # 环境温度（摄氏度）
    ambient_temp = 25 + random.uniform(-5, 5)
    
    # 风机转速（rpm）
    fan_speed = 800 + random.uniform(-100, 100)
    
    # 背压（kPa）
    backpressure = 5.5 + random.uniform(-0.5, 0.5)
    
    # 生成25个测点的数据
    data = np.array([
        _current_time,                    # 0: 时间戳
        base_load,                        # 1: 机组负荷 (MW)
        540 + random.uniform(-10, 10),    # 2: 主汽流量 (t/h)
        16.5 + random.uniform(-0.5, 0.5), # 3: 主汽压力 (MPa)
        540 + random.uniform(-5, 5),      # 4: 主汽温度 (℃)
        3.2 + random.uniform(-0.1, 0.1),  # 5: 再热蒸汽压力 (MPa)
        35 + random.uniform(-2, 2),       # 6: 凝结水泵出口母管温度 (℃)
        1200 + random.uniform(-50, 50),   # 7: 凝结水流量 (t/h)
        1200 + random.uniform(-50, 50),   # 8: 主给水流量 (t/h)
        240 + random.uniform(-5, 5),      # 9: 主给水温度 (℃)
        1200 + random.uniform(-50, 50),   # 10: 给水流量 (t/h)
        35 + random.uniform(-2, 2),       # 11: 凝结水流量 (t/h)
        35 + random.uniform(-2, 2),       # 12: 凝结水温度 (℃)
        fan_speed,                        # 13: 风机转速 (rpm)
        0.85 + random.uniform(-0.05, 0.05), # 14: 效率系数
        0.95 + random.uniform(-0.02, 0.02), # 15: 传热系数
        0.92 + random.uniform(-0.03, 0.03), # 16: 流量系数
        backpressure,                     # 17: 背压 (kPa)
        0.0055 + random.uniform(-0.0005, 0.0005), # 18: 背压 (MPa)
        ambient_temp,                     # 19: 环境温度 (℃)
        0.85 + random.uniform(-0.05, 0.05), # 20: 冷却塔效率
        0.92 + random.uniform(-0.03, 0.03), # 21: 凝汽器效率
        0.88 + random.uniform(-0.04, 0.04), # 22: 系统效率
        0.90 + random.uniform(-0.03, 0.03), # 23: 综合效率
        0.87 + random.uniform(-0.04, 0.04)  # 24: 净效率
    ], dtype=np.float32)
    
    return data

def Real_time_from_other_buffer_to_alg(logger):
    """
    模拟从InfluxDB获取实时数据
    返回: (时间戳, 数据数组)
    """
    global _current_time, _simulation_data_buffer
    
    # 更新时间
    _current_time = time.time()
    
    # 生成新的模拟数据
    new_data = _generate_simulation_data()
    
    # 将数据添加到缓冲区
    _simulation_data_buffer.append(new_data)
    
    # 保持缓冲区大小（最多保留1000条记录）
    if len(_simulation_data_buffer) > 1000:
        _simulation_data_buffer = _simulation_data_buffer[-1000:]
    
    # 返回最新数据
    latest_data = np.array([new_data], dtype=np.float32)
    
    logger.info(f"模拟实时数据获取成功，时间戳: {_current_time}")
    
    return _current_time, latest_data

def History_from_other_buffer_to_alg(logger, n=50):
    """
    模拟从InfluxDB获取历史数据
    参数:
        logger: 日志记录器
        n: 获取的历史数据条数
    返回: (时间戳, 最新数据, 历史数据数组, 数据是否足够)
    """
    global _current_time, _simulation_data_buffer
    
    # 更新时间
    _current_time = time.time()
    
    # 生成新的模拟数据
    new_data = _generate_simulation_data()
    
    # 将数据添加到缓冲区
    _simulation_data_buffer.append(new_data)
    
    # 保持缓冲区大小
    if len(_simulation_data_buffer) > 1000:
        _simulation_data_buffer = _simulation_data_buffer[-1000:]
    
    # 获取历史数据
    if len(_simulation_data_buffer) >= n:
        history_data = np.array(_simulation_data_buffer[-n:], dtype=np.float32)
        enough_history = True
    else:
        # 如果历史数据不足，用当前数据填充
        history_data = np.array([new_data] * n, dtype=np.float32)
        enough_history = False
    
    latest_data = np.array([new_data], dtype=np.float32)
    
    logger.info(f"模拟历史数据获取成功，时间戳: {_current_time}, 历史数据条数: {len(history_data)}")
    
    return _current_time, latest_data, history_data, enough_history

def written_model_data_buffer(data):
    """
    模拟将模型输出数据写入缓冲区
    参数:
        data: 要写入的数据数组
    """
    # 在实际环境中，这里会将数据写入InfluxDB
    # 在模拟环境中，我们只是记录日志
    logging.info(f"模拟数据写入缓冲区: {data}")
    
    # 可以在这里添加数据验证逻辑
    if isinstance(data, np.ndarray):
        logging.info(f"数据形状: {data.shape}, 数据类型: {data.dtype}")
    else:
        logging.warning(f"数据格式异常: {type(data)}")

def reset_simulation_data():
    """
    重置模拟数据缓冲区
    """
    global _simulation_data_buffer
    _simulation_data_buffer = []
    logging.info("模拟数据缓冲区已重置")

def set_simulation_parameters(base_load=None, ambient_temp=None, fan_speed=None, backpressure=None):
    """
    设置模拟参数
    参数:
        base_load: 基础负荷 (MW)
        ambient_temp: 环境温度 (℃)
        fan_speed: 风机转速 (rpm)
        backpressure: 背压 (kPa)
    """
    global _simulation_data_buffer
    
    # 这里可以添加参数设置逻辑
    logging.info(f"设置模拟参数 - 负荷: {base_load}, 环境温度: {ambient_temp}, 风机转速: {fan_speed}, 背压: {backpressure}")
    
    # 清空缓冲区以使用新参数
    _simulation_data_buffer = [] 